package com.iwhalecloud.citybrain.flow.platform.manager.domain.repository;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.iwhalecloud.citybrain.flow.platform.manager.common.ResponseResult;
import com.iwhalecloud.citybrain.flow.platform.manager.domain.model.*;
import com.iwhalecloud.citybrain.flow.platform.manager.domain.model.form.ExternalFormInfoTransferDTO;
import com.iwhalecloud.citybrain.flow.platform.manager.domain.model.form.ModelVersionDetailDTO;
import com.iwhalecloud.citybrain.flow.platform.manager.domain.model.model.FlowPlatformModelDetailDTO;
import com.iwhalecloud.citybrain.flow.platform.manager.domain.model.model.ModelEventTempQuery;
import com.iwhalecloud.citybrain.flow.platform.manager.domain.model.model.ModelSimpleVo;
import com.iwhalecloud.citybrain.flow.platform.manager.domain.model.model.ModelUploadDTO;
import org.flowable.engine.repository.Deployment;
import org.flowable.engine.repository.Model;

import java.util.List;
import java.util.Map;

/**
 * @author lilh
 * @date 2019-01-22 18:51
 */
public interface FlowModelRepository {
    /** 流程模型绑定的外置表单描述信息文件 */
    List<ExternalFormInfoTransferDTO> findBindExternalFormWithModel(String modelId);
    /** 批量导入外置表单描述信息文件 */
    boolean insertExternalFormBatch(List<ExternalFormInfoTransferDTO> externalFormInfoTransferDTOList);

    /**
     * 检查和清空无效表单里的流程变量
     * 表单校验时，如果表单不存在，则清空。但还应检验是否添加了无效表单里的流程变量，有的话也需要清空。
     * 匹配规则：通过json文件中流程变量对应的表单信息，查找是否存在表单，不存在就删除该变量。
     * @param modelId 模型id
     * @return 是否成功
     */
    ResponseResult checkVariableByForm(String modelId);
    /**
     * 导入流程模型json文件
     * @param modelUploadDTO 表单+文件的VO
     * @return 是否导入成功,成功则返回更新后的modelId
     */
    Map.Entry<ResponseResult, FlowPlatformModelDetailDTO> uploadJson(ModelUploadDTO modelUploadDTO);


    /**
     * 创建模型
     *
     * @param modelCreateVo 参数
     * @return 创建后的模型
     */
    ResponseResult create(ModelCreateVo modelCreateVo);

    /**
     * 复制模型
     */
    ResponseResult copy(ModelCopyVo modelCopyVo);


    /**
     * 更新模型
     *
     * @param modelSaveVo 模型数据
     * @return 更新后的模型
     */
    Model update(ModelSaveVo modelSaveVo) throws Exception;


    /**
     * 查询
     *
     * @param modelQueryVo 查询参数
     * @return 列表
     */
    ResponseResult list(ModelQueryVo modelQueryVo);
    /**
     * 查询流程模型（流程委托使用）
     *
     * @param modelQueryVo 查询参数
     * @return 列表
     */
    ResponseResult listForEntrust(ModelQueryVo modelQueryVo);
    /**
     * 版本管理，返回的数据中，包含运行时的数量和完成的数量
     * @param modelQueryVo
     * @return
     */
    ResponseResult<List<ModelVersionDetailDTO>> getModelVersionDetail(ModelQueryVo modelQueryVo);

    /**
     * 部署列表
     *
     * @param modelQueryVo
     * @return
     */
    List<FlowProcdefQueryInfo> deploymentList(ModelQueryVo modelQueryVo);

    List<ModelSimpleVo> listModel(ModelQueryVo modelQueryVo);

    /**
     * 获取流程候选人组
     *
     * @param appId 应用id
     * @return 对于应用的角色列表
     */
    List<Map<String, Object>> getCandidateGroups(Integer appId);

    /**
     * 获取模型详情
     *
     * @param modelId
     * @return
     */
    FlowPlatformModelDetailDTO getModelDetail(String modelId);

    /**
     * 获取模型详情
     *
     * @param modelId
     * @param modelCode
     * @return
     */
    FlowPlatformModelDetailDTO getModelDetail(String modelId, String modelCode);

    /**
     * 获取部署模型详情
     *
     * @param deploymentId
     * @return
     */
    ObjectNode getDeploymentDetail(String deploymentId);

    /**
     * 部署模型
     *
     * @param modelId
     * @return
     */
    Deployment deploy(String modelId);

    /**
     * 获取流程模型变量
     *
     * @param modelId
     * @return
     */
    JsonNode getModelVariables(String modelId);

    /**
     * 删除模型
     *
     * @param modelId 模型id
     * @return 是否删除
     */
    boolean deleteModel(String modelId);

    /**
     * 停用流程模型
     * @param modelId 模型id
     * @return true:成功；false:失败
     */
    boolean offlineModel(String modelId);

    /**
     * @Description 检查强制选人第一节点和后续节点规则校验
     * @author liujinjian
     * @date 2021-11-24
     * @param modelId
     * @return
     */
    ResponseResult checkFirstNodeForcePickByForm(String modelId);

    /**
     * @param modelId
     * @return
     * @Description 判断第一个节点处理人留空
     * @author lzb
     * @date 2021-12-14
     */
    ResponseResult checkFirstNodeCandidateBlank(String modelId);

    /**
     * 查询流程模型列表
     *
     * @param modelQueryNoPageVo 查询参数
     * @return 列表
     */
    ResponseResult getModelList(ModelQueryNoPageVo modelQueryNoPageVo);


    boolean checkModelExist(String modelName, String modelKey);

    /**
     * 查询流程模型事件
     *
     * @param
     * @return
     */
    ResponseResult getModelEvents(ModelEventTempQuery modelEventTempQuery);

    /**
     * 更新流程事件到临时表
     * @return
     */
    ResponseResult setModelEventsToTemp();

    /**
     * 根据modelKey换取运行中的modelId
     * @param modelKey
     * @return
     */
    String transferModelKeyToId(String modelKey);

    /**
     * 根据modelKey获取运行中的模板信息
     * @param modelKey
     * @return
     */
    ResponseResult getModelByModelKey(String modelKey);


    /**
     * 日志记录公共方法
     * @param model
     * @param action
     * @param modelStatus
     * @param newModelId
     * @param requestParam
     * @param operationMethod
     * @param requestMethod
     * @param requestUrl
     * @param status
     * @param responseResult
     */
     void commonRuleActionAuditLog(Model model, String action, String modelStatus, String newModelId,
                                         String requestParam, String operationMethod, String requestMethod, String requestUrl,
                                         String status, String responseResult);


}
